ロジスティック回帰(No library)
code: Python
class LogisticRegressionGD(object):
""" 勾配降下法に基づくロジスティック回帰分類器.
パラメータ
------------
eta : float
学習率(0.0より大きく1.0以下の値)
n_iter : int
トレーニングデータのトレーニング回数
random_state : int
重みを初期化するための乱数シード
属性
-----------
w_ : 1次元配列
適合後の重み
cost_ : リスト
各エポックでの誤差平方和のコスト関数
"""
def __init__(self, eta=0.01, n_iter=50, random_state=1):
self.eta = eta
self.n_iter = n_iter
self.random_state = random_state
def fit(self, X, y):
""" トレーニングデータに適合させる
パラメータ
----------
トレーニングデータ
n_samplesはサンプルの個数、n_featuresは特徴量の個数
目的変数
戻り値
-------
self : object
"""
rgen = np.random.RandomState(self.random_state)
self.w_ = rgen.normal(loc=0.0, scale=0.01, size=1 + X.shape1) self.cost_ = []
for i in range(self.n_iter):
net_input = self.net_input(X)
output = self.activation(net_input)
errors = (y - output)
self.w_1: += self.eta * X.T.dot(errors) self.w_0 += self.eta * errors.sum() # コストの計算
cost = -y.dot(np.log(output)) - ((1 - y).dot(np.log(1 - output)))
# 各エポックごとのコストを格納
self.cost_.append(cost)
return self
def net_input(self, X):
"""総入力を計算"""
return np.dot(X, self.w_1:) + self.w_0 def activation(self, z):
"""ロジスティックシグモイド活性化関数を計算"""
return 1. / (1. + np.exp(-np.clip(z, -250, 250)))
def predict(self, X):
"""1ステップ後のクラスラベルを返す"""
return np.where(self.net_input(X) >= 0.0, 1, 0)
# 以下に等しい:
# return np.where(self.activation(self.net_input(X)) >= 0.5, 1, 0)
code: Python
from matplotlib.colors import ListedColormap
import matplotlib.pyplot as plt
def plot_decision_regions(X, y, classifier, test_idx=None, resolution=0.02):
# マーカーとカラーマップの準備
markers = ('s', 'x', 'o', '^', 'v')
colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')
# 決定領域のプロット
x1_min, x1_max = X:, 0.min() - 1, X:, 0.max() + 1 x2_min, x2_max = X:, 1.min() - 1, X:, 0.max() + 1 # グリッドポイントの生成
xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution), np.arange(x2_min, x2_max, resolution))
# 各特徴量を1次元配列に変換して予測を実行
# 予測結果を元のグリッドポイントのデータサイズに変換
Z = Z.reshape(xx1.shape)
# グリッドポイントの等高線のプロット
plt.contourf(xx1, xx2, Z, alpha=0.3, cmap=cmap)
# 軸の範囲の設定
plt.xlim(xx1.min(), xx1.max())
plt.ylim(xx2.min(), xx2.max())
# クラスごとにサンプルをプロット
for idx, cl in enumerate(np.unique(y)):
# テストサンプルを目立たせる(点を〇で表示)
if test_idx:
# すべてのサンプルをプロット
plt.scatter(X_test:, 0, X_test:, 1, c='', edgecolors='black', alpha=1.0, linewidths=1, marker='o', s=100, label='test set') code: Python
from sklearn import datasets
import numpy as np
from sklearn.model_selection import train_test_split
iris = datasets.load_iris()
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1, stratify=y)
code: Python
# ロジスティック回帰のインスタンスを生成
lrgd = LogisticRegressionGD(eta=0.05, n_iter=1000, random_state=1)
# モデルをトレーニングデータに適合させる
lrgd.fit(X_train_01_subset, y_train_01_subset)
# 決定領域をプロット
plot_decision_regions(X=X_train_01_subset, y=y_train_01_subset, classifier=lrgd)
# 軸のラベルの設定
# 凡例の設定(左上に配置)
plt.legend(loc='upper left')
# グラフを表示
plt.tight_layout()
plt.show()
https://gyazo.com/e419750d6aef9a4074819ee3f3efd474